package com.childenglish.utils;

import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.stereotype.Component;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Base64;
import java.util.Properties;

/**
 * 验证码工具类
 * 生成图形验证码
 */
@Component
public class CaptchaUtil {

    private final DefaultKaptcha kaptcha;

    public CaptchaUtil() {
        kaptcha = new DefaultKaptcha();
        Config config = new Config(getKaptchaProperties());
        kaptcha.setConfig(config);
    }

    /**
     * 生成验证码图片（Base64编码）
     */
    public CaptchaResult generateCaptcha() {
        // 生成验证码文本
        String captchaText = kaptcha.createText();
        
        // 生成验证码图片
        BufferedImage captchaImage = kaptcha.createImage(captchaText);
        
        // 转换为Base64
        String base64Image = imageToBase64(captchaImage);
        
        return new CaptchaResult(captchaText, base64Image);
    }

    /**
     * 将图片转换为Base64字符串
     */
    private String imageToBase64(BufferedImage image) {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.write(image, "png", baos);
            byte[] imageBytes = baos.toByteArray();
            return "data:image/png;base64," + Base64.getEncoder().encodeToString(imageBytes);
        } catch (IOException e) {
            throw new RuntimeException("生成验证码图片失败", e);
        }
    }

    /**
     * 验证码配置属性
     */
    private Properties getKaptchaProperties() {
        Properties props = new Properties();
        // 图片边框
        props.setProperty("kaptcha.border", "yes");
        props.setProperty("kaptcha.border.color", "105,179,90");
        // 字体颜色
        props.setProperty("kaptcha.textproducer.font.color", "blue");
        // 图片宽高
        props.setProperty("kaptcha.image.width", "120");
        props.setProperty("kaptcha.image.height", "40");
        // 字体大小
        props.setProperty("kaptcha.textproducer.font.size", "30");
        // 验证码字符集
        props.setProperty("kaptcha.textproducer.char.string", "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
        // 验证码长度
        props.setProperty("kaptcha.textproducer.char.length", "4");
        // 字体
        props.setProperty("kaptcha.textproducer.font.names", "Arial,Courier");
        // 干扰线颜色
        props.setProperty("kaptcha.noise.color", "white");
        // 干扰实现类
        props.setProperty("kaptcha.noise.impl", "com.google.code.kaptcha.impl.DefaultNoise");
        // 背景颜色渐变
        props.setProperty("kaptcha.background.clear.from", "185,185,185");
        props.setProperty("kaptcha.background.clear.to", "white");
        // 文字间隔
        props.setProperty("kaptcha.textproducer.char.space", "3");
        return props;
    }

    /**
     * 验证码结果
     */
    public static class CaptchaResult {
        private final String text;
        private final String imageBase64;

        public CaptchaResult(String text, String imageBase64) {
            this.text = text;
            this.imageBase64 = imageBase64;
        }

        public String getText() {
            return text;
        }

        public String getImageBase64() {
            return imageBase64;
        }
    }
}

